/***************************************************************
 * lora.fileupload.js
 *
 * 插件名称: 上传文件插件
 * jQuery版本:1.9+
 * 国际惯例：Bladnir 中国大陆 第二大区三战场组 奥拉基尔
 * 邮箱：bladnir@outlook.com
 * 创建时间：2016年7月16日 
 * 描述：基于JQuery上传文件插件
 * 		返回值需要为json
 *      只能上传一个文件
 * 修改历史：
 *        2016-12-12 data属性参数上传问题
 * 
 * 参数说明：
 * {
 * 	url：上传文件处理Servlet的url
 *  data:function(){
 *  	附加参数（此处参数和url传参不同之处为，此处参数是可以动态获取的。）
 *		返回值为对象 例如
 *	var obj =	{
 *			fileInfo : $('#fileInfo').val(),
 *			fileType : 'bat'
 *		} 
 *  return obj; 
 *  
 *  }
 *  inputName：上传文件的input域的name和id属性 默认 loraFileUploadInput
 *  iframeName：上传文件提交到的iframe的name和id属性 默认 loraFileUploadIframe
 *  beforeSelectFile：function(){
 *    选择文件前触发
 *    如果返回false则不会打开选择文件的窗口
 *  }
 *  beforeSubmit : function(fileName, fileSize, extension){
 *    文件提交前触发
 *    如果返回false则不会提交文件到Servlet
 *    fileName：文件名
 *    fileSize：文件大小（单位：字节）
 *    extension：文件扩展名
 *  }
 *  submitComplete : function(response) {
 *    文件提交后处理
 *    response：Servlet中的返回值（需要为json格式 并且不要返回'false' 或者 false）
 *  }
 * }
 * 
 * 调用样例：
 * 
 * 	$('#upLoadSQLButton').fileUpload({
 *		url:'<%=basePath%>/webframework/sqlExcute/uploadSql.do',
 *		beforeSubmit: function(fileName, fileSize, extension){
 *         if(fileSize>(1024*1024)){
 *         		return false;
 *         }else{
 *         		return true;
 *         }
 *      },
 *		submitComplete:function(response){
 *			if(response && response.flag == 'success'){
 *				alert('上传成功');
 *			}
 *		}
 *	});
 * 
 * 
 ******************************************************************************/

(function($) {

	/**
	 * 构造方法
	 * 
	 */
	var FileUpload = function(button, options) {

		this._button = button;
		this._options = options;

		this._form = null;
		this._input = null;
		this._iframe = null;
		this._contentDiv = null;

		this.init();
		this.blindButton();
		this.blindInput();

	};

	/**
	 * 属性集合
	 * 
	 */
	FileUpload.prototype = {

			
		/**
		 * 初始化
		 * 创建所有的dom元素
		 * 
		 */	
		init : function() {//create all dom element
			var self = this;

			var contentDiv = $('<div></div>').css('display', 'none');
			
			var iframe = $('<iframe src="javascript:false;" />').attr('name',this._options.iframeName);
			$(iframe).attr('id',this._options.iframeName);
			
			$(iframe).on('load',function(){
				var doc = iframe.contentDocument ? iframe.contentDocument : frames[$(iframe).attr('id')].document;
				
				var response;

				if (doc.body){
					
					if($(doc.body).find('pre') !== 0){
						var preObj = $(doc.body).find('pre')[0]
						response = $(preObj).html();
					}

					if (response) {
						response = $.parseJSON(response);
						self._options.submitComplete(response);
					}
				}
			});
			
			var form = $('<form method="post" enctype="multipart/form-data"></form>');
			$(form).attr('action',this._options.url);
			$(form).attr('target',this._options.iframeName);
			
			var input = $('<input type="file" name="'+this._options.inputName+'">');
			var dataDiv = $('<div name="dataDiv"></div>');
			
			$(form).append(input).append(dataDiv);
			
			$(contentDiv).append(iframe).append(form);
			
			this._input = input;
			this._form = form;
			this._iframe = iframe;
			this._contentDiv = contentDiv;
			
			$('body').append(contentDiv);

		},

		/**
		 * 销毁方法
		 * 
		 */
		destory : function() {
			$(this._contentDiv).remove();
			this._form = null;
			this._input = null;
			this._iframe = null;
			this._contentDiv = null;
			$(button).on('click', function() {});
		},

		/**
		 * 绑定按钮事件
		 * 
		 */
		blindButton : function() {

			var self = this;

			$(self._button).on('click', function() {

				if (!self._options.beforeSelectFile()) {
					return;
				}
				$(self._input).click();

			});
		},
		
		/**
		 * 绑定上传文件的input对象事件
		 * 
		 */
		blindInput : function() {

			var self = this;

			$(self._input).on('change', function() {

				var fileFullPathName = $(self._input).val();

				if (fileFullPathName === '') {
					return;
				}

				var fileName = self.getFileName(fileFullPathName);
				var fileExtName = self.getFileExtName(fileFullPathName);
				var fileSize = self._input[0].files[0].size;

				if (!self._options.beforeSubmit(fileName, fileSize, fileExtName)) {
					return;
				}

				self.addData();
				$(self._form).submit();

			});
		},

		/**
		 * 获取文件名称
		 * 
		 */
		getFileName : function(fileFullPathName) {
			return fileFullPathName.replace(/.*(\/|\\)/, "");
		},

		/**
		 * 获取文件扩展名
		 * 
		 */
		getFileExtName : function(fileFullPathName) {
			return (/[.]/.exec(fileFullPathName)) ? /[^.]+$/.exec(fileFullPathName.toLowerCase()) : '';
		},
		
		/**
		 * 处理动态参数
		 * 
		 */
		addData : function(){
			
			var dataDiv = $(this._form).find('div[name="dataDiv"]');
			$(dataDiv).empty();
			
			var data = null;
			if(this._options.data){
				data = this._options.data();
			}
			if(!data){
				return;
			}
			
			$.each(data,function(key,value){
				var inputObject = $('<input type="text"/>').attr('name',key).attr('id',key).val(value);
				$(dataDiv).append(inputObject);
			});
			
		}

	}
	
	/**
	 * 插件入口
	 */
	$.fn.fileUpload = function(options) {
		
		var opts = $.extend({}, $.fn.fileUpload.defaults, options);
		var fileUpload = new FileUpload($(this), opts);
		return fileUpload;
	};
	
	/**
	 * 默认配置
	 */
	$.fn.fileUpload.defaults = {
		url : '',// 上传处理的Servlet地址
		data : function(){
			// 附加参数（此处参数和url传参不同之处为，此处参数是可以动态获取的。）
			// 返回值为对象 例如
			//  {
			//      fileInfo : $('#fileInfo').val(),
			//      fileType : 'bat'
			//  } 
			return null;
		},
		inputName : 'loraFileUploadInput',// input对象的name属性
		iframeName : 'loraFileUploadIframe',// iframe对象的name属性
		beforeSelectFile : function() {
			//在选择文件动作触发之前触发
			//返回true继续选择文件 返回false不会弹出选择文件对话框
			return true;
		},
		beforeSubmit : function(file, fileSize, extension) {
			// 提交到Servlet之前触发
			// 返回true 继续提交到Servlet 返回false不提交
			return true;
		},
		submitComplete : function(response) {
			//提交完成之后的回调函数
			//不要在Servlet 直接返回 "FALSE" 这样的字符串，这样会导致回掉函数无法正常调用
		}

	};

})(jQuery);